package com.topinfo.etl.util;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.*;
import java.util.Map;

public class FmTemplate {
    /**
     * 获取模版
     * @param templateName
     * @return
     */
    public Template getTemplate(String templateName) {
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_25);
        cfg.setClassForTemplateLoading(this.getClass(), "/ftl");
        Template template = null;
        try {
            template = cfg.getTemplate(templateName);
        } catch (IOException e) {
            System.out.println("获取模版失败！");
        }
        return template;
    }

    /**
     * 输出到控制台
     * @param name 模版文件名
     * @param root
     */
    public void print(String name, Map<String,Object> root){
        try {
            //通过Template可以将模版文件输出到相应的流
            Template temp = this.getTemplate(name);
            temp.process(root, new PrintWriter(System.out));
        } catch (TemplateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 输出到文件
     * @param name
     * @param root
     * @param outFile
     */
    public void fprint(String name, Map<String, Object> root, String outFile, String saveUrl){
        Writer out = null;
        try {
            //通过一个文件输出流，就可以写到相应的文件中
            File file = new File(saveUrl + outFile);
            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
            //通过Freemarker的Configuration读取相应的ftl
            Configuration cfg = new Configuration(Configuration.VERSION_2_3_25);
            //设定去哪里读取相应的ftl模版文件
            cfg.setClassForTemplateLoading(this.getClass(), "/ftl");
//			cfg.setClassForTemplateLoading(this.getClass(), "/resources/ftl");
            //在模版文件目录中找到名称为name的文件
            Template temp = cfg.getTemplate(name, "UTF-8");
            temp.process(root, out);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TemplateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if(out != null)
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
    }
}
